+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
+Thu Nov 29 21:35:56 2001 Kristian Rietveld <kristian@planet.nl>
+
+ * gtk/gtkmenu.c (gtk_menu_motion_notify): add checks for
+ empty menu items to behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.c (gtk_real_menu_item_activate_item): select
+ next item if the first item in the menu is a tear off item
+ (#59456-2, suggestion by Matthias Clasen)
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release), (gtk_menu_shell_entry_notify),
+ (gtk_menu_shell_leave_notify), (gtk_real_menu_shell_move_current),
+ (gtk_real_menu_shell_activate_current): add check, so empty
+ menu items behave like insensitive items (#59456)
+
+ * gtk/gtkmenuitem.[ch]: add _gtk_menu_item_is_selectable to make
+ the checks more readable ...
+
+ * gtk/gtkmenushell.c (gtk_menu_shell_button_press),
+ (gtk_menu_shell_button_release): causes the menu to dropdown if the
+ caption is clicked again (#64977)
+
2001-11-29 Havoc Pennington <hp@redhat.com>
* gtk/gtktextiter.c (_gtk_text_iter_forward_indexable_segment):
* which may be different from 'widget'.
*/
menu_item = gtk_get_event_widget ((GdkEvent*) event);
- if (!menu_item || !GTK_IS_MENU_ITEM (menu_item) || !GTK_WIDGET_IS_SENSITIVE (menu_item) ||
+ if (!menu_item || !GTK_IS_MENU_ITEM (menu_item) ||
+ !_gtk_menu_item_is_selectable (menu_item) ||
!GTK_IS_MENU (menu_item->parent))
return FALSE;
#include "gtkmenu.h"
#include "gtkmenubar.h"
#include "gtkmenuitem.h"
+#include "gtktearoffmenuitem.h"
+#include "gtkseparatormenuitem.h"
#include "gtksignal.h"
submenu = GTK_MENU_SHELL (menu_item->submenu);
if (submenu->children)
- gtk_menu_shell_select_item (submenu, submenu->children->data);
+ {
+ if (submenu->children->next &&
+ GTK_IS_TEAROFF_MENU_ITEM (submenu->children->data))
+ gtk_menu_shell_select_item (submenu, submenu->children->next->data);
+ else
+ gtk_menu_shell_select_item (submenu, submenu->children->data);
+ }
}
}
}
if (bin->child)
callback (bin->child, callback_data);
}
+
+gboolean
+_gtk_menu_item_is_selectable (GtkWidget *menu_item)
+{
+ if ((!GTK_BIN (menu_item)->child &&
+ G_OBJECT_TYPE (menu_item) == GTK_TYPE_MENU_ITEM) ||
+ GTK_IS_SEPARATOR_MENU_ITEM (menu_item) ||
+ !GTK_WIDGET_IS_SENSITIVE (menu_item) ||
+ !GTK_WIDGET_VISIBLE (menu_item))
+ return FALSE;
+
+ return TRUE;
+}
void gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
const gchar *accel_path);
+/* private */
void _gtk_menu_item_refresh_accel_path (GtkMenuItem *menu_item,
const gchar *prefix,
GtkAccelGroup *accel_group,
gboolean group_changed);
+gboolean _gtk_menu_item_is_selectable (GtkWidget *menu_item);
#ifndef GTK_DISABLE_DEPRECATED
#define gtk_menu_item_right_justify(menu_item) gtk_menu_item_set_right_justified ((menu_item), TRUE)
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkmenuitem.h"
-#include "gtktearoffmenuitem.h" /* FIXME */
#include "gtkmenushell.h"
#include "gtksignal.h"
#include "gtkwindow.h"
menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event);
- if (menu_item &&
- GTK_WIDGET_IS_SENSITIVE (menu_item))
+ if (menu_item && _gtk_menu_item_is_selectable (menu_item))
{
if ((menu_item->parent == widget) &&
(menu_item != menu_shell->active_menu_item))
- gtk_menu_shell_select_item (menu_shell, menu_item);
+ {
+ if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
+ g_object_set_data (G_OBJECT (menu_shell),
+ "gtk-menushell-just-activated",
+ GUINT_TO_POINTER (1));
+ gtk_menu_shell_select_item (menu_shell, menu_item);
+ }
}
}
else
menu_shell = GTK_MENU_SHELL (widget);
if (menu_shell->active)
{
+ gboolean deactivate_immediately = FALSE;
+
if (menu_shell->button && (event->button != menu_shell->button))
{
menu_shell->button = 0;
if (menu_shell->parent_menu_shell)
return gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event);
}
-
+
menu_shell->button = 0;
menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent*) event);
deactivate = TRUE;
+ if (menu_item
+ && GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
+ {
+ if (g_object_get_data (G_OBJECT (menu_shell), "gtk-menushell-just-activated"))
+ g_object_set_data (G_OBJECT (menu_shell), "gtk-menushell-just-activated", NULL);
+ else
+ deactivate_immediately = TRUE;
+ }
+
if ((event->time - menu_shell->activate_time) > MENU_SHELL_TIMEOUT)
{
+ if (deactivate_immediately)
+ {
+ gtk_menu_shell_deactivate (menu_shell);
+ return TRUE;
+ }
+
if (menu_item && (menu_shell->active_menu_item == menu_item) &&
- GTK_WIDGET_IS_SENSITIVE (menu_item))
+ _gtk_menu_item_is_selectable (menu_item))
{
if (GTK_MENU_ITEM (menu_item)->submenu == NULL)
{
return TRUE;
}
}
- else if (menu_item && !GTK_WIDGET_IS_SENSITIVE (menu_item))
+ else if (menu_item && !_gtk_menu_item_is_selectable (menu_item))
deactivate = FALSE;
else if (menu_shell->parent_menu_shell)
{
{
menu_item = gtk_get_event_widget ((GdkEvent*) event);
- if (!menu_item || !GTK_WIDGET_IS_SENSITIVE (menu_item))
+ if (!menu_item ||
+ (GTK_IS_MENU_ITEM (menu_item) &&
+ !_gtk_menu_item_is_selectable (menu_item)))
return TRUE;
if ((menu_item->parent == widget) &&
return TRUE;
}
- if (!GTK_WIDGET_IS_SENSITIVE (menu_item))
+ if (!_gtk_menu_item_is_selectable (event_widget))
return TRUE;
if ((menu_shell->active_menu_item == event_widget) &&
GtkWidget *menu_item)
{
gtk_menu_shell_deselect (menu_shell);
-
+
menu_shell->active_menu_item = menu_item;
_gtk_menu_item_set_placement (GTK_MENU_ITEM (menu_shell->active_menu_item),
GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement);
{
node = node->next;
while (node != start_node &&
- (!node ||
- !GTK_WIDGET_IS_SENSITIVE (node->data) ||
- !GTK_WIDGET_VISIBLE (node->data) ))
+ (!node || !_gtk_menu_item_is_selectable (node->data)))
{
if (!node)
node = menu_shell->children;
{
node = node->prev;
while (node != start_node &&
- (!node ||
- !GTK_WIDGET_IS_SENSITIVE (node->data) ||
- !GTK_WIDGET_VISIBLE (node->data) ))
+ (!node || !_gtk_menu_item_is_selectable (node->data)))
{
if (!node)
node = g_list_last (menu_shell->children);
case GTK_MENU_DIR_CHILD:
if (menu_shell->active_menu_item &&
- GTK_BIN (menu_shell->active_menu_item)->child &&
+ _gtk_menu_item_is_selectable (menu_shell->active_menu_item) &&
GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu)
{
menu_shell = GTK_MENU_SHELL (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu);
gboolean force_hide)
{
if (menu_shell->active_menu_item &&
- GTK_WIDGET_IS_SENSITIVE (menu_shell->active_menu_item) &&
+ _gtk_menu_item_is_selectable (menu_shell->active_menu_item) &&
GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu == NULL)
{
gtk_menu_shell_activate_item (menu_shell,
gtk_menu_shell_deactivate (menu_shell);
gtk_signal_emit (GTK_OBJECT (menu_shell), menu_shell_signals[SELECTION_DONE]);
}
-